/**
 * @file extraDataBlockControl.h
 * @author your name (you@domain.com)
 * @brief 扩展时间和时钟
 * @version 0.1
 * @date 2025-04-30
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef EXTRA_DATA_BLOCK_H
#define EXTRA_DATA_BLOCK_H
#include "xmzTypeDefine.h"
//READ_DBL


#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

// 西门子兼容错误码
#define READ_DBL_OK                0x0000  // 无错误
#define READ_DBL_DST_GT_SRC       0x0081  // 目标大于源（源写满，其余目标未变）
#define READ_DBL_SRC_GT_DST       0x8081  // 源大于目标（目标被写满）
#define READ_DBL_PARAM_ERROR      0x8093  // 模拟：目标块未指定 / 不存在
#define READ_DBL_EN_DISABLED      0x7000  // EN = false
#define READ_DBL_REQ_LOW          0x7001  // 首次调用 REQ = 0，未激活传送

// 西门子 WRIT_DBL 错误码
#define WRIT_DBL_OK               0x0000  // 正常完成
#define WRIT_DBL_DST_GT_SRC       0x0081  // 目标大于源
#define WRIT_DBL_SRC_GT_DST       0x8081  // 源大于目标
#define WRIT_DBL_TYPE_MISMATCH    0x8082  // 优化/非优化访问不一致（可忽略）
#define WRIT_DBL_PARAM_ERROR      0x8093  // 源块未指定或无效（目标也是）
#define WRIT_DBL_WRITE_PROTECT    0x80B4  // 模拟写保护
#define WRIT_DBL_NO_SPACE         0x80BB  // 模拟空间不足
#define WRIT_DBL_EN_FALSE         0x7000  // EN = false
#define WRIT_DBL_REQ_LOW          0x7001  // 首次调用 REQ=0，不激活传送

// 启动任务：返回是否成功，并提供 TaskID
/**
 * @brief 读取数据块
 * 
 * @param en 使能信号
 * @param REQ 请求信号
 * @param SRCBLK 源数据块指针
 * @param SRC_LEN 源数据块长度
 * @param RET_VAL 返回值指针
 * @param BUSY 忙状态指针
 * @param DSTBLK 目标数据块指针
 * @param DST_LEN 目标数据块长度
 * @return Bool 操作状态
 */
Bool READ_DBL(
    Bool en,
    Bool REQ,
    void *SRCBLK,
    size_t SRC_LEN,
    Int *RET_VAL,
    Bool *BUSY,
    void *DSTBLK,
    size_t DST_LEN
);




//WRIT_DBL
/**
 * @brief 写入数据块
 * 
 * @param en 使能信号
 * @param REQ 请求信号
 * @param SRCBLK 源数据块指针
 * @param SRC_LEN 源数据块长度
 * @param RET_VAL 返回值指针
 * @param BUSY 忙状态指针
 * @param DSTBLK 目标数据块指针
 * @param DST_LEN 目标数据块长度
 * @return Bool 操作状态
 */
Bool WRIT_DBL(
    Bool en,
    Bool REQ,
    void *SRCBLK,
    size_t SRC_LEN,
    Int *RET_VAL, 
    Bool *BUSY,
    void *DSTBLK,
    size_t DST_LEN
);
#endif
